<?php
/** 
 * Copyright (c) 2012, Jiehun.com.cn Inc. All Rights Reserved
 * @author Ronnie(dengxiaolong@jiehun.com.cn)
 * @date 2012-2-22
 * @version 1.0 
 * @brief 
 *  
 **/
$path = dirname(__FILE__);
require_once $path.'/lib/JSMinPlus.php';
require_once $path.'/lib/Minify_CSS.php';
require_once $path.'/lib/FileStamp.php';
final class Minify
{
	/**
	 * 根据url获取文件内容
	 * @param $dir
	 * @param $url
	 * @return string | false
	 */
	static function getByUrl($rootDir, $url, $minify = true) {
		$info = pathinfo($url);
		if ($info['dirname'] == "\\") {
			$info['dirname'] = '';
		}
		$curDir = $rootDir.$info['dirname'];
		
		// 查找相同目录内同名文件(没有.c)是否存在
		$path = $curDir.'/'.str_replace('.c.', '.', $info['basename']);
		$ext = $info['extension'];
		if (is_file($path)) {
			if (!$minify) {
				$ret = file_get_contents($path);
			} else {
				if ($ext == 'js') {
					$ret = self::minJs($path);
				} else if ($ext = 'css') {
					$ret = self::minCss($path, $rootDir, $curDir);
				}
			}
			return $ret;
		}
		
		// 超找和文件名同名的目录内是否存在相同后缀的文件
		$curDir .= '/'.substr($info['filename'], 0, -2).'/';
		if (is_dir($curDir)) {
			$files = glob($curDir.'/*.'.$ext);
			
			$ret = array();
			if (!$minify) {
				foreach($files as $file) {
					$ret[] = file_get_contents($file);
				}
			} else {
				if ($ext == 'js') {
					foreach($files as $file) {
						$ret[] = self::minJs($file);
					}
				} else {
					foreach($files as $file) {
						$ret[] = self::minCss($file, $rootDir, $curDir);
					}
				}
			}
			return implode("\n", $ret);
		}
		
		return false;
	}
	
	/**
	 * 压缩js
	 * @param string $file
	 */
	static function minJs($from)
	{
		return JSMinPlus::minify(file_get_contents($from));
	}
	
	/**
	 * 
	 * 压缩css文件
	 * @param string $from
	 * @param string $rootDir 根目录
	 * @param string $curDir 当前目录 和rootDir主要用来将css中url中的图片地址替换成正确的地址
	 * @param string $to
	 * @throws Exception
	 */
	static function minCss($from, $rootDir = null, $curDir = null, $to = null) 
	{
		$options = array();
		if ($rootDir) {
			$options['timeStampRefs'] = array();
			$options['timeStampRefs']['rootDir'] = $rootDir;
			$curDir = $curDir ? $curDir : dirname($from);
			$options['timeStampRefs']['curDir'] = $curDir ? $curDir : dirname($from);
		}
		return Minify_CSS::minify(file_get_contents($from), $options);
	}
	
	/**
	 * 获取文件戳
	 * @param string $path
	 */
	static function getFileStamp($path)
	{
		return FileStamp::getStamp($path);
	}
}
